package Leetcode.Stack;

import java.util.*;

/**
 * @Author: kirito
 * @Date: 2024/4/12 21:54
 * @Description:
 * 商品折扣后的最终价格
 * 简单
 * 相关标签
 * 相关企业
 * 提示
 * 给你一个数组 prices ，其中 prices[i] 是商店里第 i 件商品的价格。
 *
 * 商店里正在进行促销活动，如果你要买第 i 件商品，那么你可以得到与 prices[j] 相等的折扣，其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ，如果没有满足条件的 j ，你将没有任何折扣。
 *
 * 请你返回一个数组，数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。
 *
 *
 *
 * 示例 1：
 *
 * 输入：prices = [8,4,6,2,3]
 * 输出：[4,2,4,2,3]
 * 解释：
 * 商品 0 的价格为 price[0]=8 ，你将得到 prices[1]=4 的折扣，所以最终价格为 8 - 4 = 4 。
 * 商品 1 的价格为 price[1]=4 ，你将得到 prices[3]=2 的折扣，所以最终价格为 4 - 2 = 2 。
 * 商品 2 的价格为 price[2]=6 ，你将得到 prices[3]=2 的折扣，所以最终价格为 6 - 2 = 4 。
 * 商品 3 和 4 都没有折扣。
 * 示例 2：
 *
 * 输入：prices = [1,2,3,4,5]
 * 输出：[1,2,3,4,5]
 * 解释：在这个例子中，所有商品都没有折扣。
 * 示例 3：
 *
 * 输入：prices = [10,1,1,6]
 * 输出：[9,0,1,6]
 *
 *
 * 提示：
 *
 * 1 <= prices.length <= 500
 * 1 <= prices[i] <= 10^3
 */

public class finalPrices {
    public static void main(String[] args) {
//        Deque<Integer> stack = new ArrayDeque<Integer>();
//        while (!stack.isEmpty()) {
//            System.out.println(stack.pop());
//        }
        int[] t = {8, 4, 6, 2, 3};
        System.out.println(Arrays.toString(finalPrices(t)));

    }
    /**
     * 由题意应该最优解从左往右遍历
     * @param prices
     * @return
     */
    public static int[] finalPrices(int[] prices) {
        int len = prices.length;
        Deque<Integer> stack = new ArrayDeque<Integer>();
        int[] ans = new int[len];
        for (int i = 0; i < len; i++) {
            int temp = prices[i];
            while(!stack.isEmpty() && prices[stack.peek()] >= temp) {
                int preIndex = stack.pop();
                ans[preIndex] = prices[preIndex] - temp;
            }
            //可以研究一下调用区别
//            stack.add();// addLast(e);
//            stack.offer();//offerLast   addLast(e);
            //pop 弹队首。
            stack.push(i);//addFirst(e);
        }
        //可能还有没有打折的  就是后面那几个
        while (!stack.isEmpty()) {
            int t = stack.pop();
            ans[t] = prices[t];
        }
        return ans;
    }
}
